/**
 * Copyright &copy; 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.sf.dlb.utils;

import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类
 *
 * Created by jing.tan on 2018/12/10.
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd",
            "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd）
     */
    public static String getDate() {
        return getDate("yyyy-MM-dd");
    }

    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String getDate(String pattern) {
        return DateFormatUtils.format(new Date(), pattern);
    }

    /**
     * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String formatDate(Date date, Object... pattern) {
        String formatDate = null;
        if (pattern != null && pattern.length > 0) {
            formatDate = DateFormatUtils.format(date, pattern[0].toString());
        } else {
            formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
        }
        return formatDate;
    }

    /**
     * 得到日期字符串 pattern可以为："yyyy-MM-dd" "HH:mm:ss"
     */
    public static String formatDate(Date date, String pattern) {
        String formatDate = null;
        if (pattern != null) {
            formatDate = DateFormatUtils.format(date, pattern);
        }
        return formatDate;
    }

    /**
     * 得到日期时间字符串，转换格式（yyyy-MM-dd HH:mm:ss）
     */
    public static String formatDateTime(Date date) {
        return formatDate(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 得到当前时间字符串 格式（HH:mm:ss）
     */
    public static String getTime() {
        return formatDate(new Date(), "HH:mm:ss");
    }

    /**
     * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
     */
    public static String getDateTime() {
        return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 得到当前年份字符串 格式（yyyy）
     */
    public static String getYear() {
        return formatDate(new Date(), "yyyy");
    }

    /**
     * 得到date年份字符串 格式（yyyy）
     */
    public static String getDateYear(Date date) {
        return formatDate(date, "yyyy");
    }


    /**
     * 得到当前月份字符串 格式（MM）
     */
    public static String getMonth() {
        return formatDate(new Date(), "MM");
    }

    /**
     * 得到date月份字符串 格式（MM）
     */
    public static String getDateMonth(Date date) {
        return formatDate(date, "MM");
    }

    /**
     * 得到当天字符串 格式（dd）
     */
    public static String getDay() {
        return formatDate(new Date(), "dd");
    }

    /**
     * 得到date字符串 格式（dd）
     */
    public static String getDateDay(Date date) {
        return formatDate(date, "dd");
    }


    /**
     * 得到当前星期字符串 格式（E）星期几
     */
    public static String getWeek() {
        return formatDate(new Date(), "E");
    }

    /**
     * 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
     * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy.MM.dd",
     * "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 获取过去的天数
     *
     * @param date
     * @return
     */
    public static long pastDays(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (24 * 60 * 60 * 1000);
    }

    /**
     * 获取过去的小时
     *
     * @param date
     * @return
     */
    public static long pastHour(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 60 * 1000);
    }

    /**
     * 获取过去的分钟
     *
     * @param date
     * @return
     */
    public static long pastMinutes(Date date) {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 1000);
    }

    /**
     * 转换为时间（天,时:分:秒.毫秒）
     *
     * @param timeMillis
     * @return
     */
    public static String formatDateTime(long timeMillis) {
        long day = timeMillis / (24 * 60 * 60 * 1000);
        long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
        long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
        long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
        return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
    }

    /**
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return
     */
    public static boolean compareTo(Date startDate, Date endDate) {
        long i = startDate.getTime() - endDate.getTime();
        return i > 0;
    }

    /**
     * 相差时间
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return long 毫秒
     */
    public static long differTimeLong(Date startDate, Date endDate) {
        long i =  endDate.getTime()-startDate.getTime();
        return i;
    }

    /**
     * 相差天数
     *
     * @param before
     * @param after
     * @return
     */
    public static double differDay(Date before, Date after) {
        long beforeTime = before.getTime();
        long afterTime = after.getTime();
        double rest = (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
        return rest;
    }

    /**
     * 获取两个日期之间的分钟数
     *
     * @param before
     * @param after
     * @return
     */
    public static double getDistanceOfTwoMinutes(Date before, Date after) {
        long beforeTime = before.getTime();
        long afterTime = after.getTime();
        double rest = (afterTime - beforeTime) / (1000 * 60);
        return rest;
    }

    /**
     * 日期加(天数)
     *
     * @param date
     * @param days
     * @return
     * @throws Exception
     */
    public static String addTimeByDay(Date date, int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + days);

        // 设置日期输出的格式
        SimpleDateFormat ymdformatter = new SimpleDateFormat("yyyy-MM-dd");
        String ymdtime = ymdformatter.format(calendar.getTime());
        return ymdtime;
    }
    /**
     * 日期加(天数)
     *
     * @param date
     * @param days
     * @return
     * @throws Exception
     */
    public static Date addTimeByDayDate(Date date, int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + days);
        return calendar.getTime();
    }

    /**
     * 取得时间的日期
     *
     * @param timeInt 秒
     * @return
     */
    public static String ymdStr(Long timeInt) {
        String timeTemp = timeInt + "000";
        Date date = new Date(Long.parseLong(timeTemp));
        SimpleDateFormat ymdformatter = new SimpleDateFormat("yyyy-MM-dd");
        String ymdtime = ymdformatter.format(date);
        return ymdtime;
    }
    /**
     * 毫秒-》日期
     *
     * @param timeInt 毫秒
     * @return
     */
    public static String longToStrTime(Long timeInt,String formatStr) {
        Date date = new Date(timeInt);
        SimpleDateFormat ymdformatter = new SimpleDateFormat(formatStr);
        String ymdtime = ymdformatter.format(date);
        return ymdtime;
    }

    /**
     * 得到开始的时间，和结束时间
     *
     * @param hms 时分秒:"00:00:00"、 “24:00:00"
     * @return
     */
    public static long getLong(String ymd, String hms) {
        // String dataYMD = ymd;
        String dataYMDHMS = ymd + " " + hms;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long timeStart = 0;
        try {
            timeStart = sdf.parse(dataYMDHMS).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return timeStart;
    }

    /**
     * 得到开始的时间，和结束时间
     *
     * @param hms 时分秒:"00:00:00"、 “24:00:00"
     * @return
     */
    public static Date getLongDate(String ymd, String hms) {
        long time = getLong(ymd, hms);
        Date date = new Date(time);
        return date;
    }

    /**
     * 取得年月日时分秒
     *
     * @param timeInt
     * @return
     */
    public static String ymdmilStr(Long timeInt) {
        String timeTemp = timeInt + "000";
        Date date = new Date(Long.parseLong(timeTemp));
        SimpleDateFormat ymdformatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String ymdmilStr = ymdformatter.format(date);
        return ymdmilStr;
    }

    /**
     * 字符串转换成日期
     *
     * @param str
     * @return date
     */
    public static Date strToDate(String str) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Date date = null;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    /**
     * 时间秒格式化-分钟
     * @param time 秒
     * @return
     */
    public static String timeFormatMin(Integer time){
        if(null==time){
            return "0";
        }
        if(time<60){
            return "0";
        }
        if(time>=60){
            int min=time/60;
            return min+"分钟";
        }
        return "0";
    }
    /**
     * 时间秒格式化-小时|分钟
     * @param time 秒
     * @return
     */
    public static String timeFormatHourAndMin(Integer time){
        if(null==time){
            return "0";
        }
        if(time<60){
            return "0";
        }
        int hourI=3600;
        if(time>=hourI){
            int hour=time/hourI; //小时
            int min=(time-(hour*hourI))/60;//分钟
            return hour+"小时"+min+"分钟";
        }else{
            int min=time/60;
            return min+"分钟";
        }
    }
    /**
     * 时间秒格式化-天|小时|分钟
     * @param time 秒
     * @return
     */
    public static String timeFormatDayAndHourAndMin(Long time){
        if(null==time){
            return "0";
        }
        if(time<60){
            return "0";
        }
        int dayI=86400;
        if(time>=dayI){
            Long tempDay=time/dayI; //天
            int remainTime=(int)(time-(dayI*tempDay));
            String timeStr;
            if(remainTime>60){
                timeStr=timeFormatHourAndMin(remainTime);
                return tempDay+"天"+timeStr;
            }else{
                return tempDay+"天";
            }
        }else{
            return timeFormatHourAndMin(time.intValue());
        }
    }

    /**
     * 时间格式化-》xxx之前
     *  1分钟之前
     * @param data
     * @return
     */
    public static String timeFormatWhatBefore(Date data){
        Date currentDate=new Date();
        long differlong=(currentDate.getTime()-data.getTime())/1000;
        long min1=(1*60);//5分钟
        long min5=(5*60);//5分钟
        long min60=(60*60);//60分钟,1小时；
        long day1=(24*60*60);//1天；
        long number=0;
        if(differlong>=day1){
            number=differlong/day1;
            return number+"天前";
        }else if(differlong>=min60){
            number=differlong/min60;
            return number+"小时前";
        }else if(differlong>=min5&&differlong<min60){
            number=differlong/min1;
            return number+"分钟前";
        }else if(differlong<min5){
            return "刚刚";
        }
        return number+"";
    }

    /**
     * 只保留日期
     * @param dateTime
     * @return
     */
    public static Date onKeepDate(Date dateTime){
        if(null==dateTime){
            return null;
        }
        Calendar calendar=Calendar.getInstance();
        calendar.setTime(dateTime);
        int year=calendar.get(Calendar.YEAR);
        int month=calendar.get(Calendar.MONTH)+1;
        int dayOfMonth=calendar.get(Calendar.DAY_OF_MONTH);
        String dateStr=year+"-"+month+"-"+dayOfMonth;
        Date date= null;
        try {
            date = parseDate(dateStr,"yyyy-MM-dd");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    /**
     * 现在距离今天24点还有多久
     * @return 毫秒
     */
    public static long currentDistance24Long(){
        Date date=new Date();
        Date toDay= null;
        long distance=0;
        try {
            toDay = DateUtils.parseDate(DateUtils.getDate(),"yyyy-MM-dd");
            Date twoDate=DateUtils.addTimeByDayDate(toDay,1);
            distance=DateUtils.differTimeLong(date,twoDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return distance;
    }

    public static void main(String[] args) {
//        int min=60;
//        String timeStr=timeFormatMin(min);

//        int min=3600;
//        String timeStr=timeFormatHourAndMin(min);
//        System.out.println(" StringFormatUtils === "+timeStr);

//        Date date=new Date();
//        date.setTime(1547525878000L);
//        String timeStr=timeFormatWhatBefore(date);
//        System.out.println(" StringFormatUtils === "+timeStr);

//        Date dateTime=new Date();
//        Date date=onKeepDate(dateTime);
//
//        Date dateDay=addDays(date,-1);
//        System.out.println(" StringFormatUtils === "+dateDay);

//        Long min=997666L;
//        String str=timeFormatDayAndHourAndMin(min);
//        System.out.println(" StringFormatUtils === "+str);
//      计算时间相差天数；
//        Date addDay=addDays(new Date(),0);
//        double dd=differDay(addDay,new Date());
//        System.out.println(" differDay === "+dd);
//      double变负数
//        double aa=2.34;
//        double dd=-aa;
//
//        System.out.println(" differDay === "+(dd+aa));


        Date date=new Date();
        Date toDay= null;
        try {
            toDay = DateUtils.parseDate(DateUtils.getDate(),"yyyy-MM-dd");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Date twoDate=DateUtils.addTimeByDayDate(toDay,1);
        long distance=DateUtils.differTimeLong(date,twoDate);
        System.out.println("==========="+distance);
    }
}
